package com.baofu.paycore.biz.paycore.handler;

import com.baofu.paycore.biz.model.BackPayBO;
import com.baofu.paycore.biz.model.CancelBO;
import com.baofu.paycore.biz.model.ReverseBO;
import com.baofu.paycore.biz.model.WebPayBO;
import com.baofu.paycore.manager.model.ResponseBO;


/**
 * 业务处理父类
 * User: LZQ
 *
 * 统一支付技术产品的接口类
 */
public interface PayBizHandler<T,V> {

    /**
     * 异步处理
     *
     * @param payBO         订单对象
     * @return              银行跳转url
     */
    WebPayBO asyncProcess(T payBO);

    /**
     * 同步交易处理
     *
     * @param payBO         订单对象
     * @return              后台处理响应
     */
    BackPayBO process(T payBO);

    /**
     * 消费撤销
     *
     * @param payBO         订单对象
     * @return              撤销处理响应
     */
    CancelBO cancel(T payBO);

    /**
     * 回调
     *
     * @return              回调处理响应
     */
    T callBack(V callBack);

    /**
     * 冲正服务
     *
     * @param payBO         订单对象
     */
    ReverseBO reverse(T payBO);


    /**
     * 撤销冲正服务
     *
     * @param payBO         订单对象
     */
    CancelBO cancelReverse(T payBO);

    /**
     * 需重试接口 对内部资金单的重试（订单状态推进）
     *
     * @param payBO                     支付订单对象
     *
     * @return                          ResponseBO
     * @exception RuntimeException      出现异常时表示重试没有成功（子类方法实现中不可捕获异常）
     */
    ResponseBO dalInnerFundProc(T payBO) throws RuntimeException;

    /**
     * 二次支付时 回滚第一笔支付单
     *
     * @param payBO                     支付订单对象
     * @return                          ResponseBO
     * @throws RuntimeException         出现异常时表示重试没有成功（子类方法实现中不可捕获异常）
     */
    ResponseBO rollbackOrder(T payBO,T oldPayBO) throws RuntimeException;
}
